import { fileURLToPath, URL } from 'node:url'
import ElementPlus from 'unplugin-element-plus/vite'
import Components from 'unplugin-vue-components/vite'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
// import vueDevTools from 'vite-plugin-vue-devtools'
import dts from 'vite-plugin-dts'
import path from 'path'

/**
 * 自动导入 ContextMenu 组件，无需注册
 * @returns 一个 resolver 函数，用于处理 ContextMenu 组件的导入
 */
function createContextMenuResolver() {
  return (name: string) => {
    if (name.startsWith('ContextMenu')) {
      return {
        type: 'component' as const,
        name: name, // 修改为 name 而不是 importName
        from: '@imengyu/vue3-context-menu', // 注意这里字段名是 from 而不是 path
      }
    }
    return null // 注意不能返回 undefined，必须返回 null 或一个合法 resolver 对象
  }
}

// https://vite.dev/config/
export default defineConfig(({ command }) => {
  const isBuildLib = command === 'build' && process.env.BUILD_TYPE === 'lib'
  return {
    base: './',
    plugins: [
      vue(),
      vueJsx(),
      // vueDevTools(),
      dts({
        outDir: 'dist',
        include: ['packages/**/*'],
        staticImport: true,
      }),
      ElementPlus({}),
      Components({
        dts: true, // 自动生成类型声明文件
        include: [/\.vue$/, /\.vue\?vue/],
        resolvers: [
          createContextMenuResolver(), // 添加这个 resolver
        ],
      }),
    ],
    build: isBuildLib
      ? {
          lib: {
            entry: path.resolve(__dirname, 'packages/index.ts'),
            name: 'DataViewEditor',
            fileName: (format) => `index.${format}.js`,
          },
          rollupOptions: {
            external: ['vue', 'pinia'],
            output: {
              globals: {
                vue: 'Vue',
                pinia: 'Pinia',
              },
            },
          },
        }
      : undefined,
    resolve: {
      alias: {
        '@': fileURLToPath(new URL('./demo/src', import.meta.url)),
        '@packages': fileURLToPath(new URL('./packages', import.meta.url)), // 当配置 root: './demo' 后，import.meta.url 的基准路径会变成 demo 目录，因此需要使用 ../packages 向上回退一级
      },
    },
  }
})
